package io.sage.ch06.methodrefactoring;

/**
 * 6.4 Replace Temp With Query 以查询取代临时变量
 * <p>
 * 问题场景：你的程序以一个临时变量保存某一表达式的运算结果。
 * 重构思路：将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。
 * 此后，新函数就可以被其他函数使用。
 * 做法：
 * 1）找出只被赋值一次的临时变量。
 * 2）将该临时变量声明为final。
 * 3）编译
 * 4）将“对该临时变量赋值”语句的等号右侧部分提炼到一个独立函数中。
 * 5）编译测试。
 * 6）在该临时变量身上实施Inline Temp【119】
 */
public class ReplaceTempWithQuery {

    private int _quantity;
    private double _itemPrice;


    /**
     * 重构前
     */
    double getPrice() {
        double basePrice = _quantity * _itemPrice;
        double discountFactor;
        if (basePrice > 1000) {
            discountFactor = 0.95;
        } else {
            discountFactor = 0.98;
        }
        return basePrice * discountFactor;
    }

    /**
     * 重构后
     */
    double getPrice_new() {
        return basePrice() * discountFactor();
    }

    private double discountFactor() {
        if (basePrice() > 1000) {
            return 0.95;
        } else {
            return 0.98;
        }
    }

    private double basePrice() {
        return _quantity * _itemPrice;
    }
}
